home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / musik / MIDIFP21 / SOURCES / MIDI_PRT / PARAMS / PARAMS.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-08-24  |  34.4 KB  |  1,103 lines

  1. /**************************************************************
  2. *
  3. *                PARAMS.C
  4. *
  5. **************************************************************/
  6.  
  7. #include <acs.h>
  8. #include <acsplus.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <tos.h>
  12. #include <messages.pif>
  13. #include <acs_plus.pif>
  14. #include <graphics.pif>
  15. #include <diskfile.pif>
  16.  
  17. static int cdecl note(PARMBLK *parmblk) ;
  18.  
  19. #include "params.pif"
  20. #include "params.h"
  21. #include "params.ah"
  22.  
  23. #define TITLE_FIELD_LENGTH 40 /** length of title field in params object **/
  24.  
  25. static char default_path[pathname_length] ; /** for MIDI_PRT.PAR **/
  26.  
  27. /*** paths where to search for files, for all instances together ***/
  28. static char savepath[pathname_length] ;
  29. static char loadpath[pathname_length] ;
  30. static char savepathname[pathname_length] ;
  31. static char loadpathname[pathname_length] ;
  32.  
  33. /*** array for addressing menu entries in program loops, ***/
  34. /*** FONT_i are not defined in sequence by ACS !          ***/
  35.  
  36. static char FONT_INDEX[MAX_FONTS] = 
  37.     FONT_0  , FONT_1  , FONT_2  , FONT_3  , FONT_4  , FONT_5  , FONT_6  , FONT_7  , FONT_8  , FONT_9  , 
  38.     FONT_10 , FONT_11 , FONT_12 , FONT_13 , FONT_14 , FONT_15 , FONT_16 , FONT_17 , FONT_18 , FONT_19 , 
  39.     FONT_20 , FONT_21 , FONT_22 , FONT_23 ,    FONT_24 , FONT_25 , FONT_26 , FONT_27 , FONT_28 , FONT_29 , 
  40.     FONT_30 , FONT_31 , FONT_32 , FONT_33 ,    FONT_34 , FONT_35 , FONT_36 , FONT_37 , FONT_38 , FONT_39 , 
  41.     FONT_40 , FONT_41 , FONT_42 , FONT_43 ,    FONT_44 , FONT_45 , FONT_46 , FONT_47 , FONT_48 , FONT_49 , 
  42.     FONT_50 , FONT_51 , FONT_52 , FONT_53 ,    FONT_54 , FONT_55 , FONT_56 , FONT_57 , FONT_58 , FONT_59 , 
  43.     FONT_60 , FONT_61 , FONT_62 , FONT_63 ,    FONT_64 , FONT_65 , FONT_66 , FONT_67 , FONT_68 , FONT_69 , 
  44.     FONT_70 , FONT_71 , FONT_72 , FONT_73 ,    FONT_74 , FONT_75 , FONT_76 , FONT_77 , FONT_78 , FONT_79 , 
  45.     FONT_80 , FONT_81 , FONT_82 , FONT_83 ,    FONT_84 , FONT_85 , FONT_86 , FONT_87 , FONT_88 , FONT_89 , 
  46.     FONT_90 , FONT_91 , FONT_92 , FONT_93 ,    FONT_94 , FONT_95 , FONT_96 , FONT_97 , FONT_98 , FONT_99 , 
  47.     FONT_100, FONT_101, FONT_102, FONT_103,    FONT_104, FONT_105, FONT_106, FONT_107, FONT_108, FONT_109, 
  48.     FONT_110, FONT_111, FONT_112, FONT_113,    FONT_114, FONT_115, FONT_116, FONT_117, FONT_118, FONT_119, 
  49.     FONT_120, FONT_121, FONT_122, FONT_123,    FONT_124, FONT_125, FONT_126, FONT_127
  50. } ;
  51.  
  52.  
  53.  
  54. typedef struct
  55. {
  56.     /*** headline ***/
  57.     char title[80] ;
  58.  
  59.     /*** text parameters ***/
  60.     int font_id, effect ;
  61.  
  62.     /*** borders ***/
  63.     char left_border, right_border, lower_border, upper_border ;
  64.  
  65.     /*** y-distances ***/
  66.     char system_distance, track_distance, note_distance ;
  67.  
  68.     /*** bar parameters ***/ 
  69.     char bars_per_system, bar_length, sub_bars ;
  70.  
  71.     /*** vertical parameters ***/
  72.     int back_style[12], back_color[12], hor_lines, mode ;
  73.  
  74.     /*** note parameters ***/
  75.     int style[12], color[12], type ;
  76.     char height, dynamic ;
  77. PARAMS_FILE ;
  78.  
  79.  
  80. /************* OBJECT DATA PROTOTYPE BEGIN ***********************/
  81.  
  82. /*** show note style or show background style ? ***/
  83.  
  84. typedef enum {SH_NOTE, SH_BACKGROUND} SHOW ;
  85.  
  86.  
  87. typedef struct 
  88. {
  89.     char path[pathname_length] ;
  90.     SHOW show ;
  91.     int style[12], color[12], index, front ;
  92.     int back_style[12], back_color[12], back_index ;
  93.     int handle ;
  94.     int effect ;
  95.     int font_id ;
  96.     FONT_INFO *font_info ;     /* info about available GDOS fonts */
  97.     int number_fonts ;         /* number of elements in font_info[] */
  98.     Awindow *font_wi ;         /* pointer to font window */
  99.     Awindow *params_wi ;       /* pointer to the parameters window */
  100. PARAMS ;
  101.  
  102. /************* OBJECT DATA PROTOTYPE END *************************/
  103.  
  104.  
  105. /*****************/
  106. static void keys /*
  107. ******************/
  108. (
  109.     Awindow *wi,    /* input: parameters window */
  110.     int kstate,     /* input: see ACS manual */
  111.     int key            /* input: ASCII code and scan code */
  112. )
  113. {
  114.     if (set_timer(wi) == -1) Awi_sendall(REDRAW, wi) ;
  115.  
  116.     /*** forward event to ACS for further treatment (e.g. by the desktop) ***/
  117.     Awi_keys(wi, kstate, key) ;
  118. }
  119.  
  120. /**********************************************/
  121. static int cdecl background(PARMBLK *parmblk) /*
  122. ***********************************************/
  123. {
  124. PARAMS *p = (PARAMS *)parmblk->pb_parm ;
  125. int points[4], clipping_points[4] ;
  126.  
  127.     /*** calculate border points for clipping rectangle, clipping = on ***/
  128.     clipping_points[0] = parmblk->pb_xc ;    
  129.     clipping_points[1] = parmblk->pb_yc ;    
  130.     clipping_points[2] = clipping_points[0] + parmblk->pb_wc - 1 ;    
  131.     clipping_points[3] = clipping_points[1] + parmblk->pb_hc - 1 ;    
  132.     vs_clip(p->handle, TRUE, clipping_points) ;
  133.  
  134.     /*** fit points to userdef object size and location ***/
  135.     points[0] = parmblk->pb_x ;
  136.     points[1] = parmblk->pb_y ;    
  137.     points[2] = points[0] + parmblk->pb_w - 1 ;
  138.     points[3] = points[1] + parmblk->pb_h - 1 ;    
  139.  
  140.     /*** set drawing styles ***/
  141.     if (p->back_style[p->back_index] == IP_HOLLOW) 
  142.         vsf_interior(p->handle, FIS_HOLLOW) ;
  143.     else vsf_interior(p->handle, FIS_PATTERN) ;
  144.     vsf_style(p->handle, p->back_style[p->back_index]) ;
  145.     vsf_color(p->handle, p->back_color[p->back_index]) ;
  146.     vsl_color(p->handle, p->back_color[p->back_index]) ;
  147.  
  148.     /*** draw background field ***/
  149.     vr_recfl(p->handle, points) ;
  150.     if (p->back_style[p->back_index] == IP_HOLLOW) 
  151.     {
  152.         vsl_width(p->handle, 3) ;
  153.         points[1] = points[3] = (points[1] + points[3]) >> 1 ;
  154.         v_pline(p->handle, 2, points) ;
  155.         vsl_width(p->handle, 1) ;
  156.     }
  157.  
  158.     /*** workaround ???? ***/
  159.     vsf_color(p->handle, BLACK); vsl_color(p->handle, BLACK) ;
  160.  
  161.     /*** clipping = off ***/
  162.     vs_clip(p->handle, FALSE, clipping_points) ;
  163.     return(parmblk->pb_currstate) ;          
  164. }
  165.  
  166. /**********************************************/
  167. static int cdecl color_draw(PARMBLK *parmblk) /*
  168. ***********************************************/
  169. {
  170. PARAMS *p = (PARAMS *)parmblk->pb_parm ;
  171. int points[4], clipping_points[4], i ;
  172. int number_colors = ncolors ;
  173. float dx ;
  174.  
  175.     if (number_colors > 16) number_colors = 16 ;
  176.     dx = ((float)parmblk->pb_w) / number_colors ;
  177.  
  178.     /*** calculate border points for clipping rectangle, clipping = on ***/
  179.     clipping_points[0] = parmblk->pb_xc ;    
  180.     clipping_points[1] = parmblk->pb_yc ;    
  181.     clipping_points[2] = clipping_points[0] + parmblk->pb_wc - 1 ;    
  182.     clipping_points[3] = clipping_points[1] + parmblk->pb_hc - 1 ;    
  183.     vs_clip(p->handle, TRUE, clipping_points) ;
  184.  
  185.     /*** fit points to userdef object size and location ***/
  186.     points[1] = parmblk->pb_y ;    
  187.     points[3] = parmblk->pb_y + parmblk->pb_h - 1 ;    
  188.  
  189.     /*** set drawing styles ***/
  190.     vsf_interior(p->handle, FIS_SOLID) ;
  191.  
  192.     /*** draw color fields ***/
  193.     for ( i = 0 ; i < number_colors ; i++ )
  194.     {
  195.         points[0] = parmblk->pb_x + (dx * i) ;
  196.         points[2] = points[0] + dx ;
  197.         vsf_color(p->handle, i) ;
  198.         v_bar(p->handle, points) ;
  199.     }
  200.     /*** workaround ???? ***/
  201.     vsf_color(p->handle, BLACK); vsl_color(p->handle, BLACK) ;
  202.  
  203.     /*** clipping = off ***/
  204.     vs_clip(p->handle, FALSE, clipping_points) ;
  205.     return(parmblk->pb_currstate) ;          
  206. }
  207.  
  208. /****************************************/
  209. static int cdecl note(PARMBLK *parmblk) /*
  210. *****************************************/
  211. {
  212. PARAMS *p = (PARAMS *)parmblk->pb_parm ;
  213. int points[4], clipping_points[4] ;
  214. int type = 0 ;
  215.  
  216.     /*** calculate border points for clipping rectangle, clipping = on ***/
  217.     clipping_points[0] = parmblk->pb_xc ;    
  218.     clipping_points[1] = parmblk->pb_yc ;    
  219.     clipping_points[2] = clipping_points[0] + parmblk->pb_wc - 1 ;    
  220.     clipping_points[3] = clipping_points[1] + parmblk->pb_hc - 1 ;    
  221.     vs_clip(p->handle, TRUE, clipping_points) ;
  222.  
  223.     /*** fit points to userdef object size and location ***/
  224.     points[0] = parmblk->pb_x ;    
  225.     points[1] = parmblk->pb_y + (parmblk->pb_h >> 2) ;    
  226.     points[2] = parmblk->pb_x + parmblk->pb_w - 1 ;    
  227.     points[3] = parmblk->pb_y + parmblk->pb_h - 1 - (parmblk->pb_h >> 2) ;    
  228.  
  229.     /*** set drawing styles ***/
  230.     vsf_perimeter(p->handle, 1) ;  /* with perimeter */
  231.     vsl_type(p->handle, SOLID) ;
  232.  
  233.     /*** draw corresponding note ***/
  234.     switch(parmblk->pb_obj)
  235.     {
  236.         case HEAD_0: break ;
  237.         case HEAD_1: type = HEAD_LINE ; break ;
  238.         case HEAD_2: type = HEAD_TRI ; break ;
  239.         case BODY_0: break ;
  240.         case BODY_1: type = BODY_RECT ; break ;
  241.         case BODY_2: type = BODY_ELLIP ; break ;
  242.         case TAIL_0: break ;
  243.         case TAIL_1: type = TAIL_LINE ; break ;
  244.         case TAIL_2: type = TAIL_TRI ; break ;
  245.     }
  246.     if (p->front) type |= BODY_FRONT ;
  247.     draw_note(p->handle, points, type, p->style[p->index], p->color[p->index]) ;
  248.  
  249.     /*** workaround ???? ***/
  250.     vsf_color(p->handle, BLACK); vsl_color(p->handle, BLACK) ;
  251.  
  252.     /*** clipping = off ***/
  253.     vs_clip(p->handle, FALSE, clipping_points) ;
  254.     return(parmblk->pb_currstate) ;          
  255. }
  256.  
  257.  
  258. static int /* return: 0 if success, -1 if file not found or wrong format */
  259. /************/
  260. load_params /*
  261. *************/
  262. (
  263.     Awindow *wi,    /* input: parameters window */
  264.     char *path        /* input: path (including file name) */
  265. )
  266. {
  267. PARAMS *p = wi->user ;
  268. Awindow *font_wi = p->font_wi ;
  269. long filesize ;
  270. PARAMS_FILE *pf ;
  271. char *text ;
  272. int i ;
  273.  
  274.     /*** load the parameter file into RAM ***/
  275.     if ( load_file(path, &filesize, (void *)&pf) == file_loaded )
  276.     { 
  277.         if ( filesize == sizeof *pf ) 
  278.         {
  279.             /*** copy file data into object data ***/
  280.             text = wi->work[TITLE].ob_spec.tedinfo->te_ptext ; 
  281.             *text = '\0' ;
  282.             strncat(text, pf->title, TITLE_FIELD_LENGTH) ;
  283.             if (pf->bars_per_system > 99) pf->bars_per_system = 99 ; 
  284.             itoa(pf->bars_per_system, wi->work[BARS_PER_SYSTEM].ob_spec.tedinfo->te_ptext, 10) ; 
  285.             if (pf->bar_length > 99) pf->bar_length = 99 ; 
  286.             itoa(pf->bar_length, wi->work[BAR_LENGTH].ob_spec.tedinfo->te_ptext, 10) ; 
  287.             if (pf->sub_bars > 9) pf->sub_bars = 9 ; 
  288.             itoa(pf->sub_bars, wi->work[SUB_BARS].ob_spec.tedinfo->te_ptext, 10) ; 
  289.             if (pf->left_border > 99) pf->left_border = 99 ; 
  290.             itoa(pf->left_border, wi->work[LEFT_BORDER].ob_spec.tedinfo->te_ptext, 10) ; 
  291.             if (pf->right_border > 99) pf->right_border = 99 ; 
  292.             itoa(pf->right_border, wi->work[RIGHT_BORDER].ob_spec.tedinfo->te_ptext, 10) ; 
  293.             if (pf->upper_border > 99) pf->upper_border = 99 ; 
  294.             itoa(pf->upper_border, wi->work[UPPER_BORDER].ob_spec.tedinfo->te_ptext, 10) ; 
  295.             if (pf->lower_border > 99) pf->lower_border = 99 ; 
  296.             itoa(pf->lower_border, wi->work[LOWER_BORDER].ob_spec.tedinfo->te_ptext, 10) ; 
  297.             if (pf->system_distance > 99) pf->system_distance = 99 ; 
  298.             itoa(pf->system_distance, wi->work[SYSTEM_DISTANCE].ob_spec.tedinfo->te_ptext, 10) ; 
  299.             if (pf->track_distance > 99) pf->track_distance = 99 ; 
  300.             itoa(pf->track_distance, wi->work[TRACK_DISTANCE].ob_spec.tedinfo->te_ptext, 10) ; 
  301.             itoa(pf->note_distance, wi->work[NOTE_DISTANCE].ob_spec.tedinfo->te_ptext, 10) ; 
  302.             if (pf->hor_lines > 9) pf->hor_lines = 9 ;
  303.             itoa(pf->hor_lines, wi->work[HOR_LINES].ob_spec.tedinfo->te_ptext, 10) ;
  304.             for (i = 0 ; i < 12 ; i++)
  305.             {
  306.                 p->color[i]            = pf->color[i] ;
  307.                 p->style[i]            = pf->style[i] ; 
  308.                 p->back_color[i]    = pf->back_color[i] ;
  309.                 p->back_style[i]    = pf->back_style[i] ;            
  310.             }
  311.             /*** deselect radio buttons ***/
  312.             wi->work[RADIO_TAIL_0].ob_state &= ~SELECTED ;
  313.             wi->work[RADIO_TAIL_1].ob_state &= ~SELECTED ;
  314.             wi->work[RADIO_TAIL_2].ob_state &= ~SELECTED ;
  315.             wi->work[RADIO_HEAD_0].ob_state &= ~SELECTED ;
  316.             wi->work[RADIO_HEAD_1].ob_state &= ~SELECTED ;
  317.             wi->work[RADIO_HEAD_2].ob_state &= ~SELECTED ;
  318.             wi->work[RADIO_BODY_0].ob_state &= ~SELECTED ;
  319.             wi->work[RADIO_BODY_1].ob_state &= ~SELECTED ;
  320.             wi->work[RADIO_BODY_2].ob_state &= ~SELECTED ;
  321.  
  322.             /*** determine radio button for note body ***/
  323.             if ( pf->type & BODY_ELLIP ) wi->work[RADIO_BODY_2].ob_state |= SELECTED ;
  324.             else if ( pf->type & BODY_RECT ) wi->work[RADIO_BODY_1].ob_state |= SELECTED ;
  325.             else wi->work[RADIO_BODY_0].ob_state |= SELECTED ;
  326.             if ( pf->type & BODY_FRONT )
  327.             {
  328.                 wi->work[FRONT].ob_state |= SELECTED ;
  329.                 wi->work[BACK].ob_state &= ~SELECTED ;
  330.                 p->front = TRUE ;
  331.             }
  332.             else 
  333.             {
  334.                 wi->work[BACK].ob_state |= SELECTED ;
  335.                 wi->work[FRONT].ob_state &= ~SELECTED ;
  336.                 p->front = FALSE ;
  337.             }
  338.  
  339.             /*** determine radio button for note head ***/
  340.             if ( pf->type & HEAD_TRI ) wi->work[RADIO_HEAD_2].ob_state |= SELECTED ;
  341.             else if ( pf->type & HEAD_LINE ) wi->work[RADIO_HEAD_1].ob_state |= SELECTED ;
  342.             else wi->work[RADIO_HEAD_0].ob_state |= SELECTED ;
  343.  
  344.             /*** determine radio button for note tail ***/
  345.             if ( pf->type & TAIL_TRI ) wi->work[RADIO_TAIL_2].ob_state |= SELECTED ;
  346.             else if ( pf->type & TAIL_LINE ) wi->work[RADIO_TAIL_1].ob_state |= SELECTED ;
  347.             else wi->work[RADIO_TAIL_0].ob_state |= SELECTED ;
  348.  
  349.             /*** height and dynamic ***/
  350.             if (pf->height > 9) pf->height = 9 ; 
  351.             itoa(pf->height, wi->work[AVERAGE_HEIGHT].ob_spec.tedinfo->te_ptext, 10) ; 
  352.             if (pf->dynamic > 9) pf->dynamic = 9 ; 
  353.             itoa(pf->dynamic, wi->work[DYNAMIC].ob_spec.tedinfo->te_ptext, 10) ; 
  354.  
  355.             /*** fonts and headline style ***/
  356.             for ( i = 0 ; i < p->number_fonts ; i++ )
  357.             {
  358.                 if ( pf->font_id == (p->font_info + i)->font_id )
  359.                 {
  360.                     p->font_id = pf->font_id ;
  361.                     if (font_wi != NULL)
  362.                         font_wi->work[FONT_INDEX[i]].ob_state |= SELECTED ;
  363.                 }
  364.                 else
  365.                     if (font_wi != NULL)
  366.                         font_wi->work[FONT_INDEX[i]].ob_state &= ~SELECTED ;
  367.             }
  368.             p->effect = pf->effect ;
  369.             if (p->effect & BOLD)       wi->menu[_BOLD]      .ob_state |= CHECKED ;
  370.             else wi->menu[_BOLD]      .ob_state &= ~CHECKED ;
  371.             if (p->effect & LIGHT)      wi->menu[_LIGHT]     .ob_state |= CHECKED ;
  372.             else wi->menu[_LIGHT]     .ob_state &= ~CHECKED ;
  373.             if (p->effect & ITALIC)     wi->menu[_ITALIC]    .ob_state |= CHECKED ;
  374.             else wi->menu[_ITALIC]    .ob_state &= ~CHECKED ;
  375.             if (p->effect & UNDERLINED) wi->menu[_UNDERLINED].ob_state |= CHECKED ;
  376.             else wi->menu[_UNDERLINED].ob_state &= ~CHECKED ;
  377.             if (p->effect & OUTLINED)   wi->menu[_OUTLINED]  .ob_state |= CHECKED ;
  378.             else wi->menu[_OUTLINED]  .ob_state &= ~CHECKED ;
  379.  
  380.             /*** notation mode ***/
  381.             wi->menu[BEYREUTHER].ob_state &= ~CHECKED ;
  382.             wi->menu[RIEDER].ob_state &= ~CHECKED ;
  383.             wi->menu[MIX].ob_state &= ~CHECKED ;
  384.             switch (pf->mode) 
  385.             {
  386.                 case Beyreuther: wi->menu[BEYREUTHER].ob_state |= CHECKED ; break ;
  387.                 case Mix:        wi->menu[MIX].ob_state |= CHECKED ; break ;
  388.                 default:         wi->menu[RIEDER].ob_state |= CHECKED ;
  389.             }
  390.         }
  391.         else
  392.         {
  393.  
  394.             /*** file verion is not 2.x ***/ 
  395.             alert_str(WRONG_FORMAT, path) ; 
  396.  
  397.             /*** free RAM file ***/
  398.             unload_file(pf) ;
  399.             return -1 ; /* no success */
  400.         }
  401.         /*** free RAM file ***/
  402.         unload_file(pf) ;
  403.  
  404.         /*** refresh objects ***/
  405.         Awi_obchange(wi, 0, -1) ;
  406.         if (p->font_wi != NULL) Awi_obchange(p->font_wi, 0, -1) ;
  407.  
  408.         /*** actualize protocol window ***/
  409.         Awi_sendall(REDRAW, wi) ;
  410.         return 0 ; /* success */
  411.     }
  412.     else return -1 ; /* no success */
  413. }
  414.  
  415. /************************/
  416. static void save_params /*
  417. *************************/
  418. (
  419.     Awindow *wi,    /* input: parameters window */
  420.     char *path        /* input: path (including file name) */ 
  421. )
  422. {
  423. PARAMS *p = wi->user ;
  424. PARAMS_FILE pf ;
  425. int handle, i ;
  426.  
  427.     /*** try to open path ***/
  428.     handle = Fopen(path, FO_WRITE) ;
  429.     if ( handle < 0 )
  430.     {
  431.         /*** try to create ?.PAR ***/
  432.         handle = Fcreate(path, 0 /* ordinary file */) ;
  433.         if ( handle < 0 )
  434.         {
  435.             alert_str(NOT_CREATED, path) ; 
  436.             return ;
  437.         }
  438.     }
  439.     /*** prepare structure for saving parameters ***/
  440.     strcpy(pf.title, wi->work[TITLE].ob_spec.tedinfo->te_ptext) ;
  441.     pf.bars_per_system = atoi(wi->work[BARS_PER_SYSTEM].ob_spec.tedinfo->te_ptext) ; 
  442.     pf.bar_length = atoi(wi->work[BAR_LENGTH].ob_spec.tedinfo->te_ptext) ; 
  443.     pf.sub_bars = atoi(wi->work[SUB_BARS].ob_spec.tedinfo->te_ptext) ; 
  444.     pf.left_border = atoi(wi->work[LEFT_BORDER].ob_spec.tedinfo->te_ptext) ; 
  445.     pf.right_border = atoi(wi->work[RIGHT_BORDER].ob_spec.tedinfo->te_ptext) ; 
  446.     pf.upper_border = atoi(wi->work[UPPER_BORDER].ob_spec.tedinfo->te_ptext) ; 
  447.     pf.lower_border = atoi(wi->work[LOWER_BORDER].ob_spec.tedinfo->te_ptext) ; 
  448.     pf.system_distance = atoi(wi->work[SYSTEM_DISTANCE].ob_spec.tedinfo->te_ptext) ; 
  449.     pf.track_distance = atoi(wi->work[TRACK_DISTANCE].ob_spec.tedinfo->te_ptext) ; 
  450.     pf.note_distance = atoi(wi->work[NOTE_DISTANCE].ob_spec.tedinfo->te_ptext) ; 
  451.     pf.hor_lines = atoi(wi->work[HOR_LINES].ob_spec.tedinfo->te_ptext) ;
  452.     for (i = 0 ; i < 12 ; i++)
  453.     {
  454.         pf.color[i] = p->color[i] ;  
  455.         pf.style[i] = p->style[i] ;
  456.         pf.back_color[i] = p->back_color[i] ;  
  457.         pf.back_style[i] = p->back_style[i] ; 
  458.     }
  459.     pf.type = 0 ;
  460.     if (wi->work[RADIO_HEAD_1].ob_state & SELECTED) pf.type |= HEAD_LINE ;
  461.     if (wi->work[RADIO_HEAD_2].ob_state & SELECTED) pf.type |= HEAD_TRI ;
  462.     if (wi->work[RADIO_BODY_1].ob_state & SELECTED) pf.type |= BODY_RECT ;
  463.     if (wi->work[RADIO_BODY_2].ob_state & SELECTED) pf.type |= BODY_ELLIP ;
  464.     if (wi->work[FRONT].ob_state & SELECTED)        pf.type |= BODY_FRONT ;
  465.     if (wi->work[RADIO_TAIL_1].ob_state & SELECTED) pf.type |= TAIL_LINE ;
  466.     if (wi->work[RADIO_TAIL_2].ob_state & SELECTED) pf.type |= TAIL_TRI ;
  467.     pf.height = atoi(wi->work[AVERAGE_HEIGHT].ob_spec.tedinfo->te_ptext) ;
  468.     pf.dynamic = atoi(wi->work[DYNAMIC].ob_spec.tedinfo->te_ptext) ; 
  469.     pf.font_id = p->font_id ;
  470.     pf.effect = p->effect ;
  471.     if (wi->menu[BEYREUTHER].ob_state & CHECKED) pf.mode = Beyreuther ;
  472.     else if (wi->menu[MIX].ob_state & CHECKED) pf.mode = Mix ;
  473.     else pf.mode = Rieder ;
  474.  
  475.     /*** save structure ***/
  476.     if ( Fwrite(handle, sizeof pf, &pf) < 0 )
  477.         alert_str(WRITE_ERROR, path) ; 
  478.  
  479.     /*** close file ***/
  480.     Fclose(handle) ;
  481. }
  482.  
  483. /***********************/
  484. static void bold(void) /*
  485. ************************/
  486. {
  487.     /*** invert bits ***/ 
  488.     ev_object[_BOLD].ob_state ^= CHECKED ;
  489.     ((PARAMS *)(ev_window->user))->effect ^= BOLD ; 
  490.  
  491.     /*** actualize protocol window ***/
  492.     Awi_sendall(REDRAW, ev_window) ;
  493. }
  494.  
  495. /************************/
  496. static void light(void) /*
  497. *************************/
  498. {
  499.     ev_object[_LIGHT].ob_state ^= CHECKED ;
  500.     ((PARAMS *)(ev_window->user))->effect ^= LIGHT ; 
  501.     Awi_sendall(REDRAW, ev_window) ;
  502. }
  503.  
  504. /*************************/
  505. static void italic(void) /*
  506. **************************/
  507. {
  508.     ev_object[_ITALIC].ob_state ^= CHECKED ;
  509.     ((PARAMS *)(ev_window->user))->effect ^= ITALIC ; 
  510.     Awi_sendall(REDRAW, ev_window) ;
  511. }
  512.  
  513. /*****************************/
  514. static void underlined(void) /*
  515. ******************************/
  516. {
  517.     ev_object[_UNDERLINED].ob_state ^= CHECKED ;
  518.     ((PARAMS *)(ev_window->user))->effect ^= UNDERLINED ; 
  519.     Awi_sendall(REDRAW, ev_window) ;
  520. }
  521.  
  522. /***************************/
  523. static void outlined(void) /*
  524. ****************************/
  525. {
  526.     ev_object[_OUTLINED].ob_state ^= CHECKED ;
  527.     ((PARAMS *)(ev_window->user))->effect ^= HOLLOW ; 
  528.     Awi_sendall(REDRAW, ev_window) ;
  529. }
  530.  
  531.  
  532. /********************/
  533. static void uncheck /*
  534. *********************/
  535. (
  536.     OBJECT *obj    /* input: parent object */
  537. )
  538. {
  539.     obj[RIEDER].ob_state &= ~CHECKED ;
  540.     obj[MIX].ob_state &= ~CHECKED ;
  541.     obj[BEYREUTHER].ob_state &= ~CHECKED ;
  542. }
  543.  
  544. /*************************/
  545. static void rieder(void) /*
  546. **************************/
  547. {
  548.     uncheck(ev_object) ;
  549.     ev_object[RIEDER].ob_state |= CHECKED ;
  550.  
  551.     /*** actualize protocol window ***/
  552.     Awi_sendall(REDRAW, ev_window) ;
  553. }
  554.  
  555. /*****************************/
  556. static void beyreuther(void) /*
  557. ******************************/
  558. {
  559.     uncheck(ev_object) ;
  560.     ev_object[BEYREUTHER].ob_state |= CHECKED ;
  561.     Awi_sendall(REDRAW, ev_window) ;
  562. }
  563.  
  564. /**********************/
  565. static void mix(void) /*
  566. ***********************/
  567. {
  568.     uncheck(ev_object) ;
  569.     ev_object[MIX].ob_state |= CHECKED ;
  570.     Awi_sendall(REDRAW, ev_window) ;
  571. }
  572.  
  573. /*****************************/
  574. static void show_fonts(void) /*
  575. ******************************/
  576. PARAMS *p = ev_window->user ;
  577. Awindow *font_wi = p->font_wi ;
  578. int i ;
  579. char *text ;
  580.  
  581.     if (font_wi == NULL)
  582.     {
  583.         /*** window must be created ***/
  584.         p->font_wi = font_wi = Awi_create(&FONT_WINDOW) ;
  585.         if (font_wi == NULL) return ;
  586.         font_wi->user = p ;
  587.  
  588.         /*** copy filename ***/
  589.         Ast_delete(font_wi->info) ;
  590.         font_wi->info = Ast_create(ev_window->info) ;
  591.  
  592.         /*** adapt work object to number and names of fonts ***/
  593.         for ( i = 0 ; i < p->number_fonts ; i++ )
  594.         {
  595.             text = font_wi->work[FONT_INDEX[i]].ob_spec.tedinfo->te_ptext ;
  596.             strcpy(text, " ") ;
  597.             strncat(text, (p->font_info + i)->font_name, MAXLEN) ;
  598.  
  599.             /*** select object according to font ID ***/
  600.             if ( p->font_id == (p->font_info + i)->font_id )
  601.                 font_wi->work[FONT_INDEX[i]].ob_state |= SELECTED ;
  602.             else font_wi->work[FONT_INDEX[i]].ob_state &= ~SELECTED ;
  603.         }
  604.         font_wi->work[FONT].ob_height = font_wi->work[FONT_0].ob_height * p->number_fonts ;
  605.  
  606.         /*** small window needs less elements ***/
  607.         if (p->number_fonts <= 10) font_wi->wi_kind &= ~(VSLIDE|UPARROW|DNARROW|SIZER|FULLER) ;
  608.     }
  609.     Awi_show(font_wi) ; 
  610. }
  611.  
  612. /***********************/
  613. static void font(void) /*
  614. ************************/
  615. int i ;
  616. PARAMS *p = ev_window->user ;
  617.     
  618.     for ( i = 0 ; i < p->number_fonts ; i++ )
  619.         if ( ev_window->work[FONT_INDEX[i]].ob_state & SELECTED )
  620.             p->font_id = (p->font_info + i)->font_id ;
  621.     Awi_sendall( REDRAW, p->params_wi ) ;    
  622. }
  623.  
  624.  
  625. static int /* return: TRUE if task was treated, FALSE else */
  626. /********/
  627. service /*
  628. *********/
  629. (
  630.     Awindow *wi,     /* input: parameters window */
  631.     int task,         /* input: message from ACS or other window */
  632.     void *not_used  /* input: not used here */
  633. )
  634. {
  635.     switch (task)
  636.     {    
  637.     case AS_TERM: Awi_sendall(TERMINATE, wi) ; break ; 
  638.     case AS_INFO: A_dialog(&PARAMS_INFO) ; break ;
  639.     default:      return FALSE ;
  640.     }
  641.     return TRUE ;
  642. }
  643.  
  644. /***********************/
  645. static void close_font /*
  646. ************************/
  647. (
  648.     Awindow *wi /* input: font window */
  649. )
  650. { ((PARAMS *)(wi->user))->font_wi = NULL ; }
  651.  
  652.  
  653. /************************/
  654. static void color(void) /*
  655. *************************/
  656. {
  657. PARAMS *p = ev_window->user ;
  658. int number_colors = ncolors, color ;
  659. Axywh offset ;
  660.  
  661.     Aob_offset(&offset, ev_object, COLOR) ;
  662.     if (number_colors > 16) number_colors = 16 ;
  663.  
  664.     /*** update color ***/
  665.     color = (ev_mmox - offset.x - ev_window->wi_work.x) * number_colors / offset.w ;
  666.     if (p->show == SH_NOTE)
  667.     {
  668.         /*** refresh notes ***/
  669.         p->color[p->index] = color ; 
  670.         Awi_obchange(ev_window, TAIL_0, -1) ;
  671.         Awi_obchange(ev_window, TAIL_1, -1) ;
  672.         Awi_obchange(ev_window, TAIL_2, -1) ;
  673.         Awi_obchange(ev_window, BODY_0, -1) ;
  674.         Awi_obchange(ev_window, BODY_1, -1) ;
  675.         Awi_obchange(ev_window, BODY_2, -1) ;
  676.         Awi_obchange(ev_window, HEAD_0, -1) ;
  677.         Awi_obchange(ev_window, HEAD_1, -1) ;
  678.         Awi_obchange(ev_window, HEAD_2, -1) ;
  679.     }
  680.     else
  681.     {
  682.         /*** refresh background user def. ***/
  683.         p->back_color[p->back_index] = color ; 
  684.         Awi_obchange(ev_window, BACKGROUND, -1) ;
  685.     }
  686.     if (set_timer(ev_window) == -1) Awi_sendall(REDRAW, ev_window) ;
  687. }
  688.  
  689. /**************************/
  690. static void pattern(void) /*
  691. ***************************/
  692. {
  693. PARAMS *p = ev_window->user ;
  694. int style ;
  695.  
  696.     /*** update drawing style ***/
  697.     switch (ev_obnr)
  698.     {
  699.     case PATTERN_1: style = 0 ; break ; 
  700.     case PATTERN_2: style = 1 ; break ;
  701.     case PATTERN_3: style = 2 ; break ; 
  702.     case PATTERN_4: style = 3 ; break ;
  703.     case PATTERN_5: style = 4 ; break ;
  704.     case PATTERN_6: style = 5 ; break ;
  705.     case PATTERN_7: style = 6 ; break ;
  706.     case PATTERN_8: style = 7 ; break ;
  707.     case PATTERN_9: style = 8 ; break ;
  708.     }
  709.     if (p->show == SH_NOTE)
  710.     {
  711.         /*** refresh notes ***/
  712.         p->style[p->index] = style ;
  713.         Awi_obchange(ev_window, TAIL_0, -1) ;
  714.         Awi_obchange(ev_window, TAIL_1, -1) ;
  715.         Awi_obchange(ev_window, TAIL_2, -1) ;
  716.         Awi_obchange(ev_window, BODY_0, -1) ;
  717.         Awi_obchange(ev_window, BODY_1, -1) ;
  718.         Awi_obchange(ev_window, BODY_2, -1) ;
  719.         Awi_obchange(ev_window, HEAD_0, -1) ;
  720.         Awi_obchange(ev_window, HEAD_1, -1) ;
  721.         Awi_obchange(ev_window, HEAD_2, -1) ;
  722.     }
  723.     else
  724.     {
  725.         /*** refresh background user def. ***/
  726.         p->back_style[p->back_index] = style ;
  727.         Awi_obchange(ev_window, BACKGROUND, -1) ;
  728.     }
  729.     if (set_timer(ev_window) == -1) Awi_sendall(REDRAW, ev_window) ;
  730. }
  731.  
  732. /*******************************/
  733. static void radio_button(void) /*
  734.                                 *
  735. (except for the front & back    *
  736. buttons)                        *
  737. ********************************/
  738. { Awi_sendall(REDRAW, ev_window) ; }
  739.  
  740. /*********************************/
  741. static void radio_button_1(void) /*
  742.                                   *
  743. (for the front & back buttons)    *
  744. **********************************/
  745. {
  746. PARAMS *p = ev_window->user ;
  747.  
  748.     if (ev_obnr == FRONT) p->front = TRUE ;
  749.     else p->front = FALSE ;
  750.     Awi_obchange(ev_window, TAIL_0, -1) ;
  751.     Awi_obchange(ev_window, TAIL_1, -1) ;
  752.     Awi_obchange(ev_window, TAIL_2, -1) ;
  753.     Awi_obchange(ev_window, BODY_0, -1) ;
  754.     Awi_obchange(ev_window, BODY_1, -1) ;
  755.     Awi_obchange(ev_window, BODY_2, -1) ;
  756.     Awi_obchange(ev_window, HEAD_0, -1) ;
  757.     Awi_obchange(ev_window, HEAD_1, -1) ;
  758.     Awi_obchange(ev_window, HEAD_2, -1) ;
  759.     Awi_sendall(REDRAW, ev_window) ; 
  760. }
  761.  
  762. /*******************/
  763. static void save() /*
  764. ********************/
  765. { save_params(ev_window, ((PARAMS *)(ev_window->user))->path) ; }
  766.  
  767. /*******************/
  768. static void load() /*
  769. ********************/
  770. { load_params(ev_window, ((PARAMS *)(ev_window->user))->path) ; } 
  771.  
  772.  
  773. /**********************/
  774. static void save___() /*
  775. ***********************/
  776. char filename[filename_length] ; /* here: a dummy */
  777.  
  778.     switch ( get_file_name(savepathname, savepath, filename, "Save parameter file") ) 
  779.     {
  780.     case no_file_selected:  
  781.     case file_select_error: return ;
  782.     }
  783.     save_params(ev_window, savepathname) ; 
  784. }
  785.  
  786. /**********************/
  787. static void load___() /*
  788. ***********************/
  789. char filename[filename_length] ; /* here: a dummy */
  790.  
  791.     switch ( get_file_name(loadpathname, loadpath, filename, "Load parameter file") ) 
  792.     {
  793.         case no_file_selected:  
  794.         case file_select_error: return ;
  795.     }
  796.     load_params(ev_window, loadpathname) ; 
  797.  
  798.  
  799. static char *popup = "0|1|2|3|4|5|6|7|8|9|A|B" ;
  800.  
  801. /*************************/
  802. static void number(void) /*
  803. **************************/
  804. {
  805. PARAMS *p = ev_window->user ;
  806. int *index ;
  807. static char *new_selection, *old_selection ;
  808.  
  809.     if (p->show == SH_NOTE) 
  810.     {
  811.         index = &(p->index) ;
  812.         old_selection = popup + (p->index << 1) ;
  813.     }
  814.     else 
  815.     {
  816.         index = &(p->back_index) ;
  817.         old_selection = popup + (p->back_index << 1) ;
  818.     }
  819.     new_selection = Ame_strpopup(ev_window, popup, old_selection, 40, -1 , -1) ;
  820.     if (!new_selection) return ;
  821.     switch (*new_selection)
  822.     {
  823.     case '0': *index = 0 ; break ;
  824.     case '1': *index = 1 ; break ;
  825.     case '2': *index = 2 ; break ;
  826.     case '3': *index = 3 ; break ;
  827.     case '4': *index = 4 ; break ;
  828.     case '5': *index = 5 ; break ;
  829.     case '6': *index = 6 ; break ;
  830.     case '7': *index = 7 ; break ;
  831.     case '8': *index = 8 ; break ;
  832.     case '9': *index = 9 ; break ;
  833.     case 'A': *index = 10 ; break ;
  834.     case 'B': *index = 11 ; break ;
  835.     } ;
  836.     Awi_obchange(ev_window, NOTE_CARRIER_1, -1) ;
  837.     Awi_obchange(ev_window, NOTE_CARRIER_2, -1) ;
  838.     Awi_obchange(ev_window, NOTE_CARRIER_3, -1) ;
  839.     Awi_obchange(ev_window, BACKGROUND, -1) ;
  840.     ev_object[NUMBER].ob_spec.tedinfo->te_ptext[0] = popup[(*index)<<1] ;
  841.     Awi_obchange(ev_window, NUMBER, -1) ; 
  842. }
  843.  
  844. /****************************/
  845. static void show_note(void) /*
  846. *****************************/
  847. {
  848. PARAMS *p = ev_window->user ;
  849.     
  850.     p->show = SH_NOTE ;
  851.     ev_window->work[NOTE_CARRIER_1].ob_flags &= ~HIDETREE ;
  852.     ev_window->work[NOTE_CARRIER_2].ob_flags &= ~HIDETREE ;
  853.     ev_window->work[NOTE_CARRIER_3].ob_flags &= ~HIDETREE ;
  854.     ev_window->work[FRONT_BACK_CARRIER].ob_flags &= ~HIDETREE ;
  855.     Awi_obchange(ev_window, STYLE_CARRIER, -1) ;
  856. }
  857.  
  858. /**********************************/
  859. static void show_background(void) /*
  860. ***********************************/
  861. {
  862. PARAMS *p = ev_window->user ;
  863.  
  864.     p->show = SH_BACKGROUND ;
  865.     ev_window->work[NOTE_CARRIER_1].ob_flags |= HIDETREE ;
  866.     ev_window->work[NOTE_CARRIER_2].ob_flags |= HIDETREE ;
  867.     ev_window->work[NOTE_CARRIER_3].ob_flags |= HIDETREE ;
  868.     ev_window->work[FRONT_BACK_CARRIER].ob_flags |= HIDETREE ;
  869.     Awi_obchange(ev_window, STYLE_CARRIER, -1) ;
  870. }
  871.  
  872.  
  873. /******************************************************************
  874. *
  875. *             PUBLISHED INTERFACE
  876. *
  877. ******************************************************************/
  878.  
  879. /***********************/
  880. void PARAMS_destructor /*
  881. ************************/
  882. (
  883.     Awindow *params_wi /* input: parameters window to destroy */
  884. )
  885. {
  886. PARAMS *p ; 
  887.  
  888.     if (params_wi) 
  889.     {
  890.         p = params_wi->user ;
  891.         if (p) 
  892.         {
  893.             if (p->font_wi)
  894.             {
  895.                 memory_symptom = "PaDstr font_wi" ;
  896.                 Awi_delete( p->font_wi ) ;
  897.             }
  898.             memory_symptom = "PaDstr p" ;
  899.             My_free(p) ;     
  900.         }
  901.         memory_symptom = "PaDstr params_wi" ;
  902.         Awi_delete(params_wi) ; 
  903.     }
  904. }
  905.  
  906. Awindow *    /* return: NULL if no success, parameters window else */
  907. /*******************/
  908. PARAMS_constructor /*
  909. ********************/
  910. (
  911.     PARAMS_INIT *params_init /* input: init values */
  912. )
  913. {
  914. Awindow *params_wi ;
  915. PARAMS *p ;
  916. char *last_point ;
  917. int i ;
  918.  
  919.     /*** enter filename into icon text and info line ***/
  920.     PARAMS_WINDOW.iconblk = params_init->icon ;
  921.     PARAMS_WINDOW.iconblk->monoblk.ib_ptext = params_init->filename ;
  922.     PARAMS_WINDOW.info = params_init->filename ;
  923.  
  924.     /*** create the paramters window ***/
  925.     params_wi = Awi_create(&PARAMS_WINDOW) ;
  926.     if (!params_wi) return NULL ;
  927.  
  928.     /*** allocate params structure and initialize ***/
  929.     params_wi->user = p = My_alloc(sizeof *p) ;
  930.     if (!p) { PARAMS_destructor(params_wi) ; return NULL ; }
  931.     p->handle = params_init->handle ;
  932.     p->show = SH_NOTE ;
  933.     for (i = 0 ; i < 12 ; i++)
  934.     {
  935.         p->style[i] = IP_SOLID ; p->color[i] = BLACK ; 
  936.         p->back_style[i] = IP_1PATT ; p->back_color[i] = BLACK ; 
  937.     }
  938.     p->index = p->back_index = 0 ;
  939.     p->front = FALSE ;
  940.     p->effect = NORMAL ;
  941.     p->params_wi = params_wi ;
  942.     p->font_wi = NULL ;
  943.     p->font_info = params_init->font_info ;
  944.     p->number_fonts = params_init->number_fonts ;
  945.     strcpy(p->path, params_init->path) ;
  946.     strcpy(loadpath, params_init->path) ;
  947.     *( strrchr(p->path, '\\') + 1 ) = '\0' ;
  948.     *( strrchr(loadpath, '\\') + 1 ) = '\0' ;
  949.     strcat(p->path, params_init->filename) ;
  950.     strcat(loadpath, "*.PAR") ;
  951.     strcpy(savepath, loadpath) ;
  952.  
  953.     /*** extension ".PAR" for parameters filename ***/
  954.     last_point = strrchr(p->path, '.') ;   
  955.     if (last_point != NULL) *last_point = '\0' ;
  956.     strcat(p->path, ".PAR") ;
  957.  
  958.     /*** default path name (if no own parameters file exists for the MIDI file) ***/  
  959.     strcpy(default_path, apppath) ;
  960.     *( strrchr(default_path, '\\') + 1 ) = '\0' ;
  961.     strcat(default_path, "MIDI_PRT.PAR") ;
  962.  
  963.     /*** load parameters file ***/        
  964.     if ( load_params(params_wi, p->path) < 0 ) load_params(params_wi, default_path) ;
  965.  
  966.     /*** if headline still empty: enter filename into headline ***/
  967.     if ( *(params_wi->work[TITLE].ob_spec.tedinfo->te_ptext) == '\0' )
  968.         strncat(params_wi->work[TITLE].ob_spec.tedinfo->te_ptext, params_init->filename, TITLE_FIELD_LENGTH) ;
  969.  
  970.     /*** userdef drawing routines called by AES need access to PARAMS ***/ 
  971.     params_wi->work[COLOR].ob_spec.userblk->ub_parm =
  972.     params_wi->work[BACKGROUND].ob_spec.userblk->ub_parm =
  973.     params_wi->work[TAIL_0].ob_spec.userblk->ub_parm =
  974.     params_wi->work[TAIL_1].ob_spec.userblk->ub_parm =
  975.     params_wi->work[TAIL_2].ob_spec.userblk->ub_parm =
  976.     params_wi->work[HEAD_0].ob_spec.userblk->ub_parm =
  977.     params_wi->work[HEAD_1].ob_spec.userblk->ub_parm =
  978.     params_wi->work[HEAD_2].ob_spec.userblk->ub_parm =
  979.     params_wi->work[BODY_0].ob_spec.userblk->ub_parm =
  980.     params_wi->work[BODY_1].ob_spec.userblk->ub_parm =
  981.     params_wi->work[BODY_2].ob_spec.userblk->ub_parm = (long)p ;
  982.  
  983.     /*** return success message ***/
  984.     return params_wi ;
  985. }
  986.  
  987.  
  988. char *get_title(Awindow *wi) 
  989. { return wi->work[TITLE].ob_spec.tedinfo->te_ptext ; }
  990.  
  991. int get_bars_per_system(Awindow *wi)
  992. { return atoi(wi->work[BARS_PER_SYSTEM].ob_spec.tedinfo->te_ptext) ; }
  993.  
  994. int get_system_length(Awindow *wi)
  995. { return atoi(wi->work[BAR_LENGTH].ob_spec.tedinfo->te_ptext) *
  996.          atoi(wi->work[BARS_PER_SYSTEM].ob_spec.tedinfo->te_ptext); }
  997.  
  998. char get_bar_divider(Awindow *wi)
  999. { return atoi(wi->work[SUB_BARS].ob_spec.tedinfo->te_ptext) + 1 ; }
  1000.  
  1001. int get_left_border(Awindow *wi)
  1002. { return atoi(wi->work[LEFT_BORDER].ob_spec.tedinfo->te_ptext) ; }
  1003.  
  1004. int get_right_border(Awindow *wi)
  1005. { return atoi(wi->work[RIGHT_BORDER].ob_spec.tedinfo->te_ptext) ; }
  1006.  
  1007. int get_upper_border(Awindow *wi)
  1008. { return atoi(wi->work[UPPER_BORDER].ob_spec.tedinfo->te_ptext) ; }
  1009.  
  1010. int get_lower_border(Awindow *wi)
  1011. { return atoi(wi->work[LOWER_BORDER].ob_spec.tedinfo->te_ptext) ; }
  1012.  
  1013. int get_system_distance(Awindow *wi)
  1014. { return atoi(wi->work[SYSTEM_DISTANCE].ob_spec.tedinfo->te_ptext) ; }
  1015.  
  1016. int get_track_distance(Awindow *wi)
  1017. { return atoi(wi->work[TRACK_DISTANCE].ob_spec.tedinfo->te_ptext) ; }
  1018.  
  1019. int get_note_distance(Awindow *wi)
  1020. { return atoi(wi->work[NOTE_DISTANCE].ob_spec.tedinfo->te_ptext) ; }
  1021.  
  1022. int get_hor_lines(Awindow *wi)
  1023. { return atoi(wi->work[HOR_LINES].ob_spec.tedinfo->te_ptext) ; }
  1024.  
  1025. /**********************/
  1026. void get_style_params /*
  1027. ***********************/
  1028. (
  1029.     Awindow *wi,         /* input: parameters window */
  1030.     int style[12],         /* output: 12 note styles */
  1031.     int color[12],         /* output: 12 note colors */
  1032.     int *type,            /* output: note type */
  1033.     int *height,         /* output: note height */
  1034.     int *dynamic,       /* output: note dynamic */
  1035.     int back_style[12], /* output: 12 background styles */
  1036.     int back_color[12]  /* output: 12 background colors */
  1037. {
  1038. PARAMS *p = wi->user ;
  1039. int i ;
  1040.  
  1041.     /*** determine note type ***/
  1042.     *type = 0 ;
  1043.     if (wi->work[RADIO_HEAD_1].ob_state & SELECTED) *type |= HEAD_LINE ;
  1044.     if (wi->work[RADIO_HEAD_2].ob_state & SELECTED) *type |= HEAD_TRI ;
  1045.     if (wi->work[RADIO_BODY_1].ob_state & SELECTED) *type |= BODY_RECT ;
  1046.     if (wi->work[RADIO_BODY_2].ob_state & SELECTED) *type |= BODY_ELLIP ;
  1047.     if (wi->work[FRONT].ob_state & SELECTED)        *type |= BODY_FRONT ;
  1048.     if (wi->work[RADIO_TAIL_1].ob_state & SELECTED) *type |= TAIL_LINE ;
  1049.     if (wi->work[RADIO_TAIL_2].ob_state & SELECTED) *type |= TAIL_TRI ;
  1050.  
  1051.     /*** rest ***/
  1052.     for (i = 0 ; i < 12 ; i++)
  1053.     {
  1054.         color[i] = p->color[i] ;
  1055.         style[i] = p->style[i] ;
  1056.         back_color[i] = p->back_color[i] ;
  1057.         back_style[i] = p->back_style[i] ;
  1058.     }
  1059.     *height = atoi(wi->work[AVERAGE_HEIGHT].ob_spec.tedinfo->te_ptext) ;
  1060.     *dynamic = atoi(wi->work[DYNAMIC].ob_spec.tedinfo->te_ptext) ; 
  1061. }
  1062.  
  1063.  
  1064. int /* return: VDI text effects for headline */
  1065. /*****************/
  1066. get_text_effects /*
  1067. ******************/
  1068. (
  1069.     Awindow *wi /* input: parameters window */
  1070. { return ((PARAMS *)(wi->user))->effect ; }
  1071.  
  1072. int /* return: GDOS font ID */
  1073. /************/
  1074. get_font_id /*
  1075. *************/
  1076. (
  1077.     Awindow *wi    /* input: parameters window */
  1078. )
  1079. { return ((PARAMS *)(wi->user))->font_id ; }
  1080.  
  1081. int    /* return: notation mode */
  1082. /*********/
  1083. get_mode /*
  1084. **********/
  1085. (
  1086.     Awindow *wi /* input: parameters window */
  1087. )
  1088.     if (wi->menu[BEYREUTHER].ob_state & CHECKED) return Beyreuther ;
  1089.     if (wi->menu[MIX].ob_state & CHECKED) return Mix ;
  1090.     return Rieder ;
  1091. }
  1092.